package br.com.foxinline.servico;

import br.com.foxinline.enums.Relatorio;
import br.com.foxinline.modelo.CadastroIndividual;
import br.com.foxinline.modelo.Cidadao;
import br.com.foxinline.modelo.Equipe;
import br.com.foxinline.modelo.MicroArea;
import br.com.foxinline.modelo.Profissional;
import br.com.foxinline.modelo.QuestionarioAutoReferido;
import br.com.foxinline.modelo.Unidade;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.ejb.Stateless;
import javax.faces.context.FacesContext;
import javax.persistence.Parameter;
import javax.persistence.Query;
import javax.persistence.Transient;
import javax.servlet.ServletContext;

/**
 *
 * @author laverson
 */
@Stateless
public class CadastroIndividualServico extends ServicoGenerico<CadastroIndividual> {

    private Long quantidadeRegistrosResults;

    public CadastroIndividualServico() {
        super(CadastroIndividual.class);
    }

    public List<CadastroIndividual> autocomplete(String query) {
        return getEntityManager().createQuery("select c from " + CadastroIndividual.class.getSimpleName() + " c where LOWER(c.nome) LIKE '%" + query.toLowerCase().trim() + "%'").getResultList();
    }

    public List<Cidadao> pesquisarDependentes(Cidadao cidadao) {

        if (cidadao == null) {
            return new ArrayList<Cidadao>();
        }

        String sql = "SELECT cidadao FROM CadastroIndividual cadastro JOIN cadastro.cartaoResponsavelFamiliar cidadao where ";

        if (cidadao.getNome() != null && !cidadao.getNome().isEmpty()) {
            sql += "LOWER(cidadao.nome) LIKE LOWER(:nome) AND ";
        }

        if (cidadao.getNumeroCartaoSus() != null && !cidadao.getNumeroCartaoSus().isEmpty()) {
            sql += "LOWER(cidadao.numeroCartaoSus) LIKE LOWER(:numeroCartaoSus) AND ";
        }

        if (cidadao.getCpf() != null && !cidadao.getCpf().isEmpty()) {
            sql += "LOWER(cidadao.cpf) LIKE LOWER(:cpf) AND ";
        }

        sql += "1=1";

        Query query = getEntityManager().createQuery(sql);

        if (cidadao.getNome() != null && !cidadao.getNome().isEmpty()) {
            query.setParameter("nome", "%" + cidadao.getNome() + "%");
        }

        if (cidadao.getNumeroCartaoSus() != null && !cidadao.getNumeroCartaoSus().isEmpty()) {
            query.setParameter("numeroCartaoSus", "%" + cidadao.getNumeroCartaoSus() + "%");
        }

        if (cidadao.getCpf() != null && !cidadao.getCpf().isEmpty()) {
            query.setParameter("cpf", "%" + cidadao.getCpf() + "%");
        }

        return query.getResultList();
    }

    @Override
    public List<CadastroIndividual> pesquisar(CadastroIndividual cadastro, int first, int pageSize) {
        String select = "SELECT cadastro ";
        String sql = "FROM CadastroIndividual cadastro ";
        String orderBy = "ORDER BY cadastro.id ASC";

        Cidadao cidadao = null;
        Profissional profissional = null;
        Cidadao responsavel = null;
        Equipe equipe = null;
        Unidade unidade = null;
        MicroArea microArea = null;
        QuestionarioAutoReferido questionario = cadastro.getQuestionarioAutoReferido();

        if (cadastro.getCidadao() != null) {
            cidadao = cadastro.getCidadao();
            if ((cidadao.getNumeroCartaoSus() != null && !cidadao.getNumeroCartaoSus().isEmpty())
                    || (cidadao.getNome() != null && !cidadao.getNome().isEmpty())) {
                sql += " JOIN cadastro.cidadao cidadao ";
            }
        }

        if (cadastro.getCartaoResponsavelFamiliar() != null) {
            responsavel = cadastro.getCartaoResponsavelFamiliar();

            if ((responsavel.getNumeroCartaoSus() != null && !responsavel.getNumeroCartaoSus().isEmpty())
                    || (responsavel.getNome() != null && !responsavel.getNome().isEmpty())) {
                sql += " JOIN cadastro.cartaoResponsavelFamiliar responsavel ";
            }
        }

        if (questionario != null) {
            if (questionario.getTuberculose() != null && questionario.getTuberculose() == true
                    || questionario.getDiabetes() != null && questionario.getDiabetes() == true
                    || questionario.getGestante() != null && questionario.getGestante() == true
                    || questionario.getCancer() != null && questionario.getCancer() == true
                    || questionario.getDstsAids() != null && questionario.getDstsAids() == true
                    || questionario.getAvc() != null && questionario.getAvc() == true
                    || questionario.getHipertensao() != null && questionario.getHipertensao() == true
                    || questionario.getPossuiProblemaRenal() != null && questionario.getPossuiProblemaRenal() == true
                    || questionario.getPossuiDoencaCardiaca() != null && questionario.getPossuiDoencaCardiaca() == true
                    || questionario.getPossuiDoencaPulmonar() != null && questionario.getPossuiDoencaPulmonar() == true) {
                sql += "  JOIN cadastro.questionarioAutoReferido questionario ";
            }
        }
        if (cadastro.getProfissional() != null) {
            profissional = cadastro.getProfissional();

            equipe = profissional.getEquipe() != null ? profissional.getEquipe() : null;
            microArea = profissional.getMicroArea() != null ? profissional.getMicroArea() : null;

            if (equipe != null) {
                unidade = equipe.getUnidade() != null ? equipe.getUnidade() : null;
            }

            if ((profissional.getNumeroCartaoSus() != null && !profissional.getNumeroCartaoSus().isEmpty())
                    || (profissional.getNome() != null && !profissional.getNome().isEmpty())) {

                sql += "JOIN cadastro.profissional profissional ";

                if (unidade != null && unidade.getCodigoCNES() != null && !unidade.getCodigoCNES().isEmpty()) {
                    sql += "JOIN profissional.equipe equipe JOIN equipe.unidade unidade ";

                } else if ((equipe.getCodigo() != null && !equipe.getCodigo().isEmpty())) {
                    sql += "JOIN profissional.equipe equipe ";
                }

                if (microArea != null && microArea.getCodigo() != null && !microArea.getCodigo().isEmpty()) {
                    sql += "JOIN profissional.microArea microArea ";
                }
            }
        }

        sql += " where ";

        if (questionario != null) {

            if (questionario.getTuberculose() != null && questionario.getTuberculose() == true) {
                sql += " questionario.tuberculose = true and ";
            }
            if (questionario.getDiabetes() != null && questionario.getDiabetes() == true) {
                sql += "  questionario.diabetes = true and ";
            }
            if (questionario.getGestante() != null && questionario.getGestante() == true) {
                sql += "  questionario.gestante = true and ";
            }
            if (questionario.getCancer() != null && questionario.getCancer() == true) {
                sql += "  questionario.cancer = true and ";
            }
            if (questionario.getDstsAids() != null && questionario.getDstsAids() == true) {
                sql += "  questionario.dstsAids = true and ";
            }
            if (questionario.getAvc() != null && questionario.getAvc() == true) {
                sql += "  questionario.avc = true and ";
            }
            if (questionario.getHipertensao() != null && questionario.getHipertensao() == true) {
                sql += "  questionario.hipertensao = true and ";
            }
            if (questionario.getPossuiProblemaRenal() != null && questionario.getPossuiProblemaRenal() == true) {
                sql += "  questionario.possuiProblemaRenal = true and ";
            }
            if (questionario.getPossuiDoencaCardiaca() != null && questionario.getPossuiDoencaCardiaca() == true) {
                sql += "  questionario.possuiDoencaCardiaca = true and ";
            }
            if (questionario.getPossuiDoencaPulmonar() != null && questionario.getPossuiDoencaPulmonar() == true) {
                sql += "  questionario.possuiDoencaPulmonar = true and ";
            }
        }

        if (microArea != null && microArea.getId() != null) {
            sql += " m.id = :microID and ";
        }

        if (cidadao != null) {
            if (cidadao.getNumeroCartaoSus() != null && !cidadao.getNumeroCartaoSus().isEmpty()) {
                sql += "LOWER(cidadao.numeroCartaoSus) LIKE LOWER(:numeroCartaoSUSCidadao) AND ";
            }
            if (cidadao.getNome() != null && !cidadao.getNome().isEmpty()) {
                sql += "LOWER(cidadao.nome) LIKE LOWER(:nomeCidadao) AND ";
            }
        }

        if (responsavel != null) {
            if (responsavel.getNumeroCartaoSus() != null && !responsavel.getNumeroCartaoSus().isEmpty()) {
                sql += "LOWER(responsavel.numeroCartaoSus) LIKE LOWER(:numeroCartaoSUSResponsavel) AND ";
            }
            if (responsavel.getNome() != null && !responsavel.getNome().isEmpty()) {
                sql += "LOWER(responsavel.nome) LIKE LOWER(:nomeResponsavel) AND ";
            }
        }

        if (profissional != null) {
            if (profissional.getNumeroCartaoSus() != null && !profissional.getNumeroCartaoSus().isEmpty()) {
                sql += "LOWER(profissional.numeroCartaoSus) LIKE LOWER(:numeroCartaoSusProfissional) AND ";
            }
            if (profissional.getNome() != null && !profissional.getNome().isEmpty()) {
                sql += "LOWER(profissional.nome) LIKE LOWER(:nomeProfissional) AND ";
            }
        }

        if (unidade != null && unidade.getCodigoCNES() != null && !unidade.getCodigoCNES().isEmpty()) {
            sql += "LOWER(unidade.codigoCNES) LIKE LOWER(:codigoCNESUnidade) AND ";
        }

        if (equipe != null && equipe.getCodigo() != null && !equipe.getCodigo().isEmpty()) {
            sql += "LOWER(equipe.codigo) LIKE LOWER(:codigoEquipe) AND ";
        }

        if (microArea != null && microArea.getCodigo() != null && !microArea.getCodigo().isEmpty()) {
            sql += "LOWER(microArea.codigo) LIKE LOWER(:codigoMicroArea) AND ";
        }

        if (cadastro.getDataCadastro() != null) {
            sql += "LOWER(cadastro.dataCadastrado) LIKE LOWER(:dataCadastro) AND ";
        }

        sql += "cadastro.ativo = true AND cadastro.atual = true ";

        Query query = getEntityManager().createQuery(select.concat(sql).concat(orderBy));

        setQuantidadeRegistros(sql, query, cadastro);

        setParameters(query, cadastro);

        query.setFirstResult(first).setMaxResults(pageSize);

        return query.getResultList();
    }

    @Transient
    private void setParameters(Query query, CadastroIndividual cadastro) {
        Cidadao cidadao = null;
        Cidadao responsavel = null;
        Profissional profissional = null;
        Equipe equipe = null;
        Unidade unidade = null;
        MicroArea microArea = null;

        if (cadastro.getCidadao() != null) {
            cidadao = cadastro.getCidadao();
        }

        if (cadastro.getProfissional() != null) {
            profissional = cadastro.getProfissional();

            equipe = profissional.getEquipe() != null ? profissional.getEquipe() : null;
            microArea = profissional.getMicroArea() != null ? profissional.getMicroArea() : null;

            if (equipe != null) {
                unidade = equipe.getUnidade() != null ? equipe.getUnidade() : null;
            }
        }

        if (cadastro.getCartaoResponsavelFamiliar() != null) {
            responsavel = cadastro.getCartaoResponsavelFamiliar();
        }

        if (cidadao != null) {
            if (cidadao.getNumeroCartaoSus() != null && !cidadao.getNumeroCartaoSus().isEmpty()) {
                query.setParameter("numeroCartaoSUSCidadao", "%" + cidadao.getNumeroCartaoSus().trim() + "%");
            }
            if (cidadao.getNome() != null && !cidadao.getNome().isEmpty()) {
                query.setParameter("nomeCidadao", "%" + cidadao.getNome().trim() + "%");
            }
        }

        if (responsavel != null) {
            if (responsavel.getNumeroCartaoSus() != null && !responsavel.getNumeroCartaoSus().isEmpty()) {
                query.setParameter("numeroCartaoSUSResponsavel", "%" + responsavel.getNumeroCartaoSus().trim() + "%");
            }
            if (responsavel.getNome() != null && !responsavel.getNome().isEmpty()) {
                query.setParameter("nomeResponsavel", "%" + responsavel.getNome().trim() + "%");
            }
        }

        if (profissional != null) {
            if (profissional.getNumeroCartaoSus() != null && !profissional.getNumeroCartaoSus().isEmpty()) {
                query.setParameter("numeroCartaoSusProfissional", "%" + profissional.getNumeroCartaoSus().trim() + "%");
            }
            if (profissional.getNome() != null && !profissional.getNome().isEmpty()) {
                query.setParameter("nomeProfissional", "%" + profissional.getNome().trim() + "%");
            }
        }

        if (unidade != null && unidade.getCodigoCNES() != null && !unidade.getCodigoCNES().isEmpty()) {
            query.setParameter("codigoCNESUnidade", "%" + unidade.getCodigoCNES().trim() + "%");
        }

        if (equipe != null && equipe.getCodigo() != null && !equipe.getCodigo().isEmpty()) {
            query.setParameter("codigoEquipe", "%" + equipe.getCodigo().trim() + "%");
        }

        if (microArea != null && microArea.getCodigo() != null && !microArea.getCodigo().isEmpty()) {
            query.setParameter("codigoMicroArea", "%" + microArea.getCodigo().trim() + "%");
        }

        if (cadastro.getDataCadastro() != null) {
            query.setParameter("dataCadastro", cadastro.getDataCadastro());
        }
    }

    private void setQuantidadeRegistros(String sql, Query query, CadastroIndividual cadastro) {

        String select = "SELECT count(cadastro) ";

        query = getEntityManager().createQuery(select.concat(sql));

        setParameters(query, cadastro);

        quantidadeRegistrosResults = (Long) query.getSingleResult();
    }

    @Override
    public Long quantidadeRegistros() {
        return quantidadeRegistrosResults;
    }

    /**
     *
     * @param cadastroIndividual
     * @param cidadao
     * @param questionario
     * @return
     *
     * Pesquisar Genérica Cadastro Individual By Ely
     */
    public List<CadastroIndividual> pesquisarCadastroIndividual(CadastroIndividual cadastroIndividual, Cidadao cidadao, QuestionarioAutoReferido questionario, MicroArea microArea) {
        String sql = "select c from CadastroIndividual c ";

        if (microArea != null && microArea.getId() != null) {
            sql += " JOIN c.profissional p JOIN p.microArea m";
        }

        if (cidadao != null) {
            if (cidadao.getNome() != null && !cidadao.getNome().isEmpty()) {
                sql += " JOIN c.cidadao cid";
            }
        }

        if (questionario.getTuberculose() == true || questionario.getDiabetes() || questionario.getGestante()
                || questionario.getCancer() == true || questionario.getDstsAids() == true || questionario.getAvc() == true
                || questionario.getHipertensao() == true || questionario.getPossuiProblemaRenal() == true
                || questionario.getPossuiDoencaCardiaca() == true || questionario.getPossuiDoencaPulmonar() == true) {
            sql += "  JOIN c.questionarioAutoReferido q ";
        }

        sql += " WHERE ";

        if (questionario.getTuberculose() == true) {
            sql += " q.tuberculose = true and ";
        }
        if (questionario.getDiabetes() == true) {
            sql += " q.diabetes = true and ";
        }
        if (questionario.getGestante() == true) {
            sql += " q.gestante = true and ";
        }
        if (questionario.getCancer() == true) {
            sql += " q.cancer = true and ";
        }
        if (questionario.getDstsAids() == true) {
            sql += " q.dstsAids = true and ";
        }
        if (questionario.getAvc() == true) {
            sql += " q.avc = true and ";
        }
        if (questionario.getHipertensao() == true) {
            sql += " q.hipertensao = true and ";
        }
        if (questionario.getPossuiProblemaRenal() == true) {
            sql += " q.possueProblemaRenal = true and ";
        }
        if (questionario.getPossuiDoencaCardiaca() == true) {
            sql += " q.possuiDoencaCardiaca = true and ";
        }
        if (questionario.getPossuiDoencaPulmonar() == true) {
            sql += " q.possuiDoencaPulmonar = true and ";
        }

        if (microArea != null && microArea.getId() != null) {
            sql += " m.id = :microID and ";
        }
        sql += " 1=1 and c.atual = true ";

        if (cidadao != null) {
            if (cidadao.getNome() != null && !cidadao.getNome().isEmpty()) {
                sql += " Order by c.cidadao.nome ASC";
            }
        }

        Query query = getEntityManager().createQuery(sql);

        if (microArea != null && microArea.getId() != null) {
            query.setParameter("microID", microArea.getId());
        }

        return query.getResultList();
    }

    public void relatorioCadastroIndividualCidadaoDoenca(HashMap parametros, CadastroIndividual c, Cidadao cid, QuestionarioAutoReferido q, MicroArea m) {

        List<CadastroIndividual> cadastroIndividuals = pesquisarCadastroIndividual(c, cid, q, m);

        if (q.getDiabetes() == true) {
        }


        URL subreport = Thread.currentThread().getContextClassLoader().getResource("br/com/foxinline/relatorio/relatorioCadastroIndividualCidadaoGenerico.jasper");
//        final String sub = subreport.toString().replace("reportmcmv_subreport1_1.jasper", "");
//        parametros.put("SUBREPORT_DIR", sub);

        FacesContext facesContext = FacesContext.getCurrentInstance();
        ServletContext servletContext = (ServletContext) facesContext.getExternalContext().getContext();
//        parametros.put("IMAGE_DIR", servletContext.getRealPath("/media/images/brasao.jpg"));
        RelatorioServico.genReport(parametros, cadastroIndividuals, Relatorio.CADASTRO_INDIVIDUAL_CIDADAO_DOENCAS);
    }
    // Diagnóstico  

    public Long QtdPacienteDiabetes() {
        String sql = "SELECT count(i.id) FROM CadastroIndividual i JOIN i.questionarioAutoReferido q WHERE q.diabetes = true  and i.atual = true";
        Query query = getEntityManager().createQuery(sql);
        return (Long) query.getSingleResult();
    }

    public Long QtdPacienteDstsAids() {
        String sql = "SELECT count(i.id) FROM CadastroIndividual i JOIN i.questionarioAutoReferido q WHERE q.dstsAids = true and i.atual = true";
        Query query = getEntityManager().createQuery(sql);
        return (Long) query.getSingleResult();
    }

    public Long QtdPacienteTuberculose() {
        String sql = "SELECT count(i.id) FROM CadastroIndividual i JOIN i.questionarioAutoReferido q WHERE q.tuberculose = true and i.atual = true";
        Query query = getEntityManager().createQuery(sql);
        return (Long) query.getSingleResult();
    }

    public Long QtdPacienteAVC() {
        String sql = "SELECT count(i.id) FROM CadastroIndividual i JOIN i.questionarioAutoReferido q WHERE q.avc = true and i.atual = true";
        Query query = getEntityManager().createQuery(sql);
        return (Long) query.getSingleResult();
    }

    public Long QtdPacienteCancer() {
        String sql = "SELECT count(i.id) FROM CadastroIndividual i JOIN i.questionarioAutoReferido q WHERE q.cancer = true and i.atual = true";
        Query query = getEntityManager().createQuery(sql);
        return (Long) query.getSingleResult();
    }

    public Long QtdPacienteHipertensao() {
        String sql = "SELECT count(i.id) FROM CadastroIndividual i JOIN i.questionarioAutoReferido q WHERE q.hipertensao = true and i.atual = true";
        Query query = getEntityManager().createQuery(sql);
        return (Long) query.getSingleResult();
    }

    public Long QtdPacientePossueDoencaPulmonar() {
        String sql = "SELECT count(i.id) FROM CadastroIndividual i JOIN i.questionarioAutoReferido q WHERE q.possuiDoencaPulmonar = true and i.atual = true";
        Query query = getEntityManager().createQuery(sql);
        return (Long) query.getSingleResult();
    }

    public Long QtdPacientePossuiDoencaRenal() {
        String sql = "SELECT count(i.id) FROM CadastroIndividual i JOIN i.questionarioAutoReferido q WHERE q.possuiProblemaRenal = true and i.atual = true";
        Query query = getEntityManager().createQuery(sql);
        return (Long) query.getSingleResult();
    }

    public Long QtdPacientePossueDoencaCardiaca() {
        String sql = "SELECT count(i.id) FROM CadastroIndividual i JOIN i.questionarioAutoReferido q WHERE q.possuiDoencaCardiaca = true and i.atual = true";
        Query query = getEntityManager().createQuery(sql);
        return (Long) query.getSingleResult();
    }
}
